/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agb.Controlador;





import java.util.ArrayList;         // libreria para realizar listas 
      // libreria Academica 
import org.me.codigo.Baldor;        // libreria Utiles
           // liberia Datos

/**
 *
 * @author Lizardo Rios Villavicencio
 */
import agb.Conexion.Sql;
public class UsuarioLOG {

    private String resultado = null;
    
    public UsuarioLOG(){
        Sql conexion = new Sql();
    }
            
    private void insertar(UsuarioWeb u) {
        String sql = "INSERT INTO usuario_web VALUES("+ u.getCodUsuarioWeb() +"," +
                ""+ u.getCodPersona() +","+
                ""+ u.getCodTipoUsuarioWeb() +"," +
                "'"+ u.getAlias() +"',"+
                "'"+ u.getClave() +"',"+
                ""+ u.getActivo() +","+
                "'"+ u.getRecordatorio() +"')";
        if (Sql.ejecuta(sql) == null) {
            resultado = "Se insertò sastifactoriamente la cuenta de usuario ...!";
        } else {
            resultado = "Error al insertar la cuenta de usuario ...!";
        }
    }
    
    public void insertar(UsuarioWeb u, boolean activo) {
        if (activo) {
            int[] tipos = new int[6];
            String[] campos = new String[6];
            //String sql = "INSERT INTO usuario_web VALUES(?,?,?,?,?,?,?)"; 
            String sql = "INSERT INTO usuario_web VALUES( " +
                         "      (SELECT MAX(cod_usuarioweb)+1 FROM usuario_web), " +
                         "    	?,?,?,?,TRUE,NULL,?,?);";
            tipos[0] = 6;   campos[0] = Baldor.aCadena(u.getCodPersona());
            tipos[1] = 6;   campos[1] = Baldor.aCadena(u.getCodTipoUsuarioWeb());
            tipos[2] = 8;   campos[2] = u.getAlias();
            tipos[3] = 8;   campos[3] = u.getClave();
            tipos[4] = 8;   campos[4] = u.getPreguntaSecreta();
            tipos[5] = 8;   campos[5] = u.getRespuestaSecreta();
            if (Sql.ejecuta(sql, tipos, campos) == null) {
                resultado = "Se insertó sastifactoriamente la cuenta de usuario ...!";
            } else {
                resultado = "Error al insertar la cuenta de usuario ...!";
            }
            //resultado = (Sql.ejecuta(sql, tipos, campos) == null) ? "Se insertó sastifactoriamente la cuenta de usuario ...!" : "Error al insertar la cuenta de usuario ...!";
        } else {
            insertar(u);
        }
    }
    
    public void modificar(UsuarioWeb u, boolean activo) {
        int codUsuario = u.getCodUsuarioWeb();
        int codTipoUsuario = u.getCodTipoUsuarioWeb();
        String alias = u.getAlias();
        String clave = u.getClave();
        boolean bactivo = u.getActivo();
        String pregunta = u.getPreguntaSecreta();
        String respuesta = u.getRespuestaSecreta();
        
        if (activo) {
            int[] tipos = new int[7];
            String[] campos = new String[7];
            String sql = "UPDATE usuario_web SET cod_tipousuarioweb = ?, " +
                         "alias = ?, " +
                         "clave = ?, " +
                         "activo = ?, " +
                         "pregunta_secreta = ?, " +
                         "respuesta_secreta = ? " +
                         "WHERE cod_usuarioweb = ?";
            tipos[0] = 6;   campos[0] = Baldor.aCadena(codTipoUsuario);
            tipos[1] = 8;   campos[1] = alias;
            tipos[2] = 8;   campos[2] = clave;
            tipos[3] = 1;   campos[3] = Baldor.aCadena(bactivo);
            tipos[4] = 8;   campos[4] = pregunta;
            tipos[5] = 8;   campos[5] = respuesta;
            tipos[6] = 6;   campos[6] = Baldor.aCadena(codUsuario);
            if (Sql.ejecuta(sql, tipos, campos) == null) {
                resultado = "Se modificò sastifactoriamente la cuenta de usuario ...!";
            } else {
                resultado = "Error al modificar la cuenta de usuario ...!";
            }
            
        } else {
            //modificar(u); // falta implementar esta operacion
        }
    }
    
    public void eliminar(UsuarioWeb u, boolean activo) {
        if (activo) {
            int[] tipos = new int[1];
            String[] campos = new String[1];
            String sql = "DELETE FROM usuario_web WHERE cod_usuarioweb = ?";
            tipos[0] = 6;   campos[0] = Baldor.aCadena(u.getCodUsuarioWeb());
            if (Sql.ejecuta(sql, tipos, campos) == null) {
                resultado = "Se eliminó sastifactoriamente la cuenta de usuario ...!";
            } else {
                resultado = "Error al eliminar la cuenta de usuario ...!";
            }
            
        } else {
            //eliminar(u);    // falta implementar esta operacion
        }
    }
    
    public int dameCodigoPersona(ArrayList lista) {
        String[] fila = null;
        int codigo = 0;
                
        if (lista != null) {
            if (lista.size() > 1) {
                fila = Sql.getFila(lista);
                if (fila.length > 0) 
                    codigo = Baldor.aEntero(fila[0]);
            }
        }
        return codigo;
    }
    
    public int dameCodigoTipo(ArrayList lista) {
        String[] fila = null;
        int tipo = 0;
                
        if (lista != null) {
            if (lista.size() > 1) {
                fila = Sql.getFila(lista);
                if (fila.length > 0) 
                    tipo = Baldor.aEntero(fila[1]);
            }
        }
        return tipo;
    }
    
    public String dameNombreTipo(ArrayList lista) {
        String[] fila = null;
        String nombre = null;
                
        if (lista != null) {
            if (lista.size() > 1) {
                fila = Sql.getFila(lista);
                if (fila.length > 0) 
                    nombre =fila[2];
            }
        }
        return nombre;
    }
    
    public String dameNombrePersona(ArrayList lista) {
        String[] fila = null;
        String nombre = null;
                
        if (lista != null) {
            if (lista.size() > 1) {
                fila = Sql.getFila(lista);
                if (fila.length > 0) 
                    nombre = fila[3];
            }
        }
        return nombre;
    }
    
    public ArrayList buscaPermisos(int tipo) {
        int[] tipos = new int[1];
        String[] campos = new String[1];
        String sql = "SELECT * " +
                     "FROM tipousuarioweb_pagina " +
                     "WHERE activo = TRUE " +
                     "AND cod_tipousuarioweb = ? ";
        tipos[0] = 6;   campos[0] = Baldor.aCadena(tipo);
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
     public ArrayList buscaCodigosAlumnos(int codPersona) {
        int[] tipos = new int[1];
        String[] campos = new String[1];
            String sql = "SELECT cod_persona, LPAD(TRIM(TO_CHAR(cod_persona,'99999999')),8,'0') AS codigo, " +
                         "apell_paterno || ' ' || apell_materno || ', ' || primer_nombre || ' ' || " +
                         "otros_nombres AS persona FROM p_natural WHERE cod_persona IN(" +
                         "    SELECT cod_persona FROM parentesco WHERE cod_pariente IN (" +
                         "        SELECT cod_pariente FROM pariente WHERE cod_persona = ?))";
        tipos[0] = 6;   campos[0] = Baldor.aCadena(codPersona);
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
     
     public ArrayList listarTipoUsuario() {
        int[] tipos = new int[0];
        String[] campos = new String[0];
        String sql = "SELECT t.cod_tipousuarioweb, t.nombre " +
                     "FROM tipo_usuarioweb t " +
                     "ORDER BY t.nombre;";
        
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
    public void buscaUsuario(UsuarioWeb u, boolean conClave) {
        ArrayList lista = new ArrayList();
        int[] tipos = new int[2];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[2];
        String sql = "SELECT U.cod_persona, U.cod_tipousuarioweb, T.nombre, " +
                     "       P.apell_paterno || ' ' || P.apell_materno || ', ' || " +
                     "       P.primer_nombre || ' ' || " +
                     "       P.otros_nombres AS personaz " +
                     "FROM usuario_web U " +
                     "INNER JOIN tipo_usuarioweb T " +
                     "  ON (T.cod_tipousuarioweb = U.cod_tipousuarioweb) " +
                     "INNER JOIN p_natural P " +
                     "  ON (U.cod_persona = P.cod_persona) " +
                     "WHERE U.activo = TRUE " +
                     "AND UPPER(U.alias) = UPPER(?) ";
        //U.activo = TRUE AND ..
        if (conClave) 
            sql += "AND U.clave = ?";
        tipos[0] = 8;   campos[0] = u.getAlias();
        tipos[1] = 8;   campos[1] = u.getClave();
        lista = (ArrayList) Sql.consulta(sql, tipos, campos);
        if (lista != null) {
            String[] fila = Sql.getFila(lista);
            if (fila != null) {
                if (fila.length > 0) {
                    u.setCodPersona(Baldor.aEntero(fila[0]));
                    u.setCodTipoUsuarioWeb(Baldor.aEntero(fila[1]));
                    u.setTipoUsuario(fila[2]);
                    u.setNombrePersona(fila[3]);
                    u.setValido(true);
                }
           }
        }
    }
    
    public ArrayList listarCuentasUsuarioWebs(UsuarioWeb u) {
        int codPersona = u.getCodPersona();
        int[] tipos = new int[1];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[1];
        String sql = "SELECT u.cod_persona, u.alias || ' ( ' || t.nombre || ')' AS cuenta, u.activo " +
                     "FROM usuario_web u " +
                     "INNER JOIN tipo_usuarioweb t ON(t.cod_tipousuarioweb = u.cod_tipousuarioweb) " +
                     "WHERE u.cod_persona = ?;";
        tipos[0] = 6;   campos[0] = Baldor.aCadena(codPersona);
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
    public ArrayList buscarApellidosMaternos(String valor) {
        int[] tipos = new int[0];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[0];
        //"WHERE LOWER(p.apell_paterno) LIKE LOWER('?%') " +
        //"WHERE LOWER(p.apell_paterno) = LOWER(?) " +
        
        String sql = "SELECT  DISTINCT(p.apell_materno) " +
                     "FROM p_natural p " +
                     "WHERE LOWER(p.apell_paterno) LIKE LOWER('"+ valor +"%') " +
                     "ORDER BY p.apell_materno;";
        //tipos[0] = 8;   campos[0] = valor;
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
    public ArrayList filtrarXapellidos(String apellPaterno, String apellMaterno) {
        int[] tipos = new int[0];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[0];
        //"WHERE LOWER(p.apell_paterno) LIKE LOWER('?%') " +
        //"WHERE LOWER(p.apell_paterno) = LOWER(?) " +
        
        String sql = "SELECT  DISTINCT(p.cod_persona), " +
                     "p.apell_paterno || ' ' || p.apell_materno || ', '|| p.primer_nombre || ' ' || p.otros_nombres AS persona " +
                     "FROM p_natural p " +
                     "WHERE LOWER(p.apell_paterno) LIKE LOWER('"+ apellPaterno +"%') " +
                     "AND lower(p.apell_materno) = LOWER('"+ apellMaterno +"') " +
                     "ORDER BY persona;";
        
        //tipos[0] = 8;   campos[0] = valor;
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
    public ArrayList listarUsuarioWeb() {
        int[] tipos = new int[0];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[0];
        String sql = "SELECT  DISTINCT(u.cod_persona), " +
                     "        p.apell_paterno || ' ' || p.apell_materno || ', '|| p.primer_nombre || ' ' || p.otros_nombres AS persona " +
                     "FROM p_natural p " +
                     "INNER JOIN usuario_web u ON(p.cod_persona = u.cod_persona) " +
                     "ORDER BY persona;";
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
    public ArrayList listarUsuarioWeb(UsuarioWeb u) {
        int codPersona = u.getCodPersona();
        int[] tipos = new int[1];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[1];
        String sql = "SELECT  u.cod_usuarioweb, t.nombre, u.alias, u.clave, u.activo, " +
                     "        u.pregunta_secreta, u.respuesta_secreta, u.cod_persona " +
                     "FROM usuario_web u " +
                     "INNER JOIN tipo_usuarioweb t ON(u.cod_tipousuarioweb = t.cod_tipousuarioweb) " +
                     "WHERE u.cod_persona = ?;";
        tipos[0] = 6;   campos[0] = Baldor.aCadena(codPersona);
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
    public ArrayList listarUsuarioWebXcodigo(UsuarioWeb u) {
        int codUsuarioWeb = u.getCodUsuarioWeb();
        int[] tipos = new int[1];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[1];
        String sql = "SELECT  u.cod_persona, u.cod_usuarioweb, " +
                     "        u.cod_tipousuarioweb, u.alias, u.clave, " +
                     "        u.activo, u.pregunta_secreta, u.respuesta_secreta " +
                     "FROM usuario_web u " +
                     "WHERE u.cod_usuarioweb = ?;";
        tipos[0] = 6;   campos[0] = Baldor.aCadena(codUsuarioWeb);
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
    
    public boolean verificarID(UsuarioWeb u) {
        ArrayList lista = new ArrayList();
        boolean estado = false;
        int[] tipos = new int[1];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[1];
        String sql = "SELECT u.pregunta_secreta " +
                     "FROM usuario_web u " +
                     "WHERE u.cod_usuarioweb = ?;";
        tipos[0] = 6;   campos[0] = Baldor.aCadena(u.getCodUsuarioWeb());
        lista = (ArrayList) Sql.consulta(sql, tipos, campos);
        if (lista != null) {
            String[] fila = Sql.getFila(lista);
            if (fila != null) {
                if (fila.length > 0) {
                    u.setPreguntaSecreta(fila[0]);
                    estado = true;
                }
            }
        }
        return estado;
    }
    
    public ArrayList recuperarCuenta(UsuarioWeb u) {
        int[] tipos = new int[3];           // no olvidar de dimensionar siempre los arreglos
        String[] campos = new String[3];
        String sql = "SELECT u.alias, u.clave " +
                     "FROM usuario_web u " +
                     "WHERE u.cod_usuarioweb = ? " +
                     "AND LOWER(u.pregunta_secreta) = LOWER(?) " +
                     "AND LOWER(u.respuesta_secreta) = LOWER(?);"; 
        tipos[0] = 6;   campos[0] = Baldor.aCadena(u.getCodUsuarioWeb());
        tipos[1] = 8;   campos[1] = u.getPreguntaSecreta();
        tipos[2] = 8;   campos[2] = u.getRespuestaSecreta();
        return (ArrayList) Sql.consulta(sql, tipos, campos);
    }
            
    /////////////////////////////////////////////////////////////////////////
    public boolean getError() {
        return (Boolean)Sql.getEstadoError();
    }
    
    public String getMensaje() {
        if (resultado == null) 
            resultado = "No se realizó ninguna operación";
        return this.resultado;
    }    
}
